﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;

namespace FeiraGame_XNA
{
    /// <summary>
    /// Classe responsavel pela Camera
    /// </summary>
    public static class Camera
    {
        #region Variaveis
        private static Vector2 position = Vector2.Zero;
        private static Vector2 viewPortSize = Vector2.Zero;
        private static Rectangle worldRectangle = new Rectangle(0, 0, 0, 0);
        #endregion

        #region Acessando variaveis

        /// <summary>
        /// Pega ou seta a posição da câmera
        /// </summary>
        public static Vector2 Position
        {
            get { return position; }
            set
            {
                position = new Vector2(
                    MathHelper.Clamp(value.X, worldRectangle.X, worldRectangle.Width - ViewPortWidth),
                    MathHelper.Clamp(value.Y, worldRectangle.Y, worldRectangle.Height - ViewPortHeight));
            }
        }

        /// <summary>
        /// Pega ou seta o tamanho do retângulo do mundo (da fase)
        /// </summary>
        public static Rectangle WorldRectangle
        {
            get { return worldRectangle; }
            set { worldRectangle = value; }
        }

        /// <summary>
        /// Pega ou seta a largura da cãmera.
        /// </summary>
        public static int ViewPortWidth
        {
            get { return (int)viewPortSize.X; }
            set { viewPortSize.X = value; }
        }

        /// <summary>
        /// Pega ou seta a altura da câmera
        /// </summary>
        public static int ViewPortHeight
        {
            get { return (int)viewPortSize.Y; }
            set { viewPortSize.Y = value; }
        }

        /// <summary>
        /// Seta o retângulo responsável pela câmera
        /// </summary>
        public static Rectangle ViewPort
        {
            get
            {
                return new Rectangle((int)Position.X, (int)Position.Y,
                                     ViewPortWidth, ViewPortHeight);
            }
        }
        #endregion

        #region Métodos

        /// <summary>
        /// Essa funcao move a câmera numa determinada quantidade de pixels.
        /// </summary>
        /// <param name="offset">Quantidade de pixels</param>
        public static void Move(Vector2 offset)
        {
            Position += offset;
        }

        /// <summary>
        /// Essa funcao checa se o objeto está visível em relação a câmera
        /// </summary>
        /// <param name="bounds">Retângulo que diz a posição do objeto</param>
        public static bool ObjectIsVisible(Rectangle bounds)
        {
            return (ViewPort.Intersects(bounds));
        }

        /// <summary>
        /// Essa funcao transforma uma coordenada qualquer no mapa em coordenadas da câmera
        /// </summary>
        /// <param name="point">Um ponto qualquer no mapa</param>
        public static Vector2 Transform(Vector2 point)
        {
            return point - position;
        }

        /// <summary>
        /// Essa funcao transforma um retângulo com coordenada qualquer no mapa em coordenadas da câmera
        /// </summary>
        /// <param name="rectangle">Um retângulo qualquer no mapa</param>
        public static Rectangle Transform(Rectangle rectangle)
        {
            return new Rectangle(
                rectangle.Left - (int)position.X,
                rectangle.Top - (int)position.Y,
                rectangle.Width,
                rectangle.Height);
        }
        #endregion
    }
}

